﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Web.Security;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Data;
using System.IO;
using System.Text;
using System.IO.Compression;

public partial class GeraArquivos : System.Web.UI.Page
{
    ConexaoMDBD Command = new ConexaoMDBD();
    PopulaDropDownList PopulaDDL = new PopulaDropDownList();

    GerenciaDiretorio GDCriaDiretorio = new GerenciaDiretorio();
    GerenciaArquivo GDCriaArquivo = new GerenciaArquivo();
    ObtemDDL CriaDDL = new ObtemDDL();
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Session["ses_login_validado"].ToString() == "S" && Session["ses_ind_admi_dado"].ToString() == "S")
            {
                Label lbl_cabecalho = (Label)Master.FindControl("lbl_cabecalho");
                lbl_cabecalho.Text = "Bem vindo, " + Session["ses_nome_pess"].ToString() + ".";
            }
            else
            {
                Response.Redirect("Default.aspx"); 
            }

            Popula_ddl_cod_ista();
            ddl_cod_sist.Enabled = false;
        }
    }

    protected void Popula_ddl_cod_ista()
    {
        PopulaDDL.dsResultado("PACK_APP_POPULA_DDL.PROC_APP_POPULA_DDL_COD_ISTA", ddl_cod_ista, "COD_ISTA", "NOME_ISTA", null);
    }

    protected void ddl_cod_ista_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddl_cod_ista.SelectedValue != "0")
        {
            PopulaDDL.dsResultado("PACK_APP_POPULA_DDL.PROC_APP_POPULA_DDL_COD_SCHM", ddl_cod_usre_corrwin, "COD_SCHM", "NOME_SCHM", ddl_cod_ista.SelectedValue.ToString());
            PopulaDDL.dsResultado("PACK_APP_POPULA_DDL.PROC_APP_POPULA_DDL_COD_SCHM", ddl_cod_usre_sinawin, "COD_SCHM", "NOME_SCHM", ddl_cod_ista.SelectedValue.ToString());
            ddl_cod_usre_corrwin.SelectedValue = "0";
            ddl_cod_usre_sinawin.SelectedValue = "0";
        }
        else
        {
            ddl_cod_usre_corrwin.DataSource = null;
            ddl_cod_usre_corrwin.DataBind();

            ddl_cod_usre_sinawin.DataSource = null;
            ddl_cod_usre_sinawin.DataBind();
        }
    }

    protected void rbl_tipo_arquivo_destino_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (rbl_tipo_arquivo_destino.SelectedValue == "T")
        {
            ddl_cod_sist.Enabled = true;
            PopulaDDL.dsResultado("PACK_APP_POPULA_DDL.PROC_APP_POPULA_DDL_COD_SIST", ddl_cod_sist, "COD_SIST", "NOME_MODELO", null);
        }
        else
        {
            ddl_cod_sist.SelectedValue = "0";
            ddl_cod_sist.Enabled = false;
        }
    }

    protected void btn_gerar_arquivo_Command(object sender, CommandEventArgs e)
    {
        //Se selecionado, obtém o DDL atualizado dos schemas.
        if (cbx_atualizar_ddl.Checked == true)
        {
            //01 - Obter o DDL para o CORRWIN
            CriaDDL.GeraDDL(ddl_cod_usre_corrwin.SelectedItem.ToString(), "N", "S");

            //02 - Obter o DDL para o SINAWIN
            CriaDDL.GeraDDL(ddl_cod_usre_sinawin.SelectedItem.ToString(), "N", "N");
        }
        
        //Verifica e executa para o tipo de arquivo selecionado: IV ou Team System
        if (rbl_tipo_arquivo_destino.SelectedValue == "I")
        {
            GerarArquivoIV();   
        }
        else
        {
            GerarArquivoTS();
        }
    }

    protected void GerarArquivoIV()
    {
        String NomeArquivo = "";
        
        //01 - Criar o Diretório 'IV'
        String NomeDiretorio = GDCriaDiretorio.NomeDiretorioCriado("IV", null, null, true);

        //02 - Criar 1 arquivo para cada tipo de objeto
        //02.a - obtem a lista de tipos de objetos arquivos
        DataSet dsListaArquivo = CriaDDL.dsListaArquivo("PACK_GERA_DDL.SP_LISTA_ARQUIVO");

        //02.b - cria o arquivo
        foreach (DataRow drListaArquivo in dsListaArquivo.Tables[0].Rows)
        {
            Boolean GravaArquivo = false;

            //02.b - cria o arquivo
            NomeArquivo = GDCriaArquivo.NomeArquivoCriado(NomeDiretorio, drListaArquivo[0].ToString(), true);

            //03 - Para cada tipo de arquivo, popula com cada 1 dos objetos
            //03.a - obtem a lista de objetos, para o tipo de objeto em questão
            DataSet dsListaObjeto = CriaDDL.dsListaObjeto("PACK_GERA_DDL.SP_LISTA_OBJETO", drListaArquivo[1].ToString(), null);

            //03.b - para cada tipo de arquivo, grava no arquivo .sql a primeira linha comentada com o tipo de arquivo
            GravaArquivo = GDCriaArquivo.GravaArquivo(NomeArquivo, "-- " + drListaArquivo[1].ToString());

            foreach (DataRow drListaObjeto in dsListaObjeto.Tables[0].Rows)
            {
                //03.c - para cada arquivo do tipo específico, grava o comando de CREATE
                GravaArquivo = GDCriaArquivo.GravaArquivo(NomeArquivo, drListaObjeto[1].ToString());
            }
        }

        lbl_resultado.Text = "Arquivos do tipo IV gerados com sucesso";
        lbl_resultado.Visible = true;
    }

    protected void GerarArquivoTS()
    {
        String NomeDiretorio = "";
        String NomeArquivo = "";

        //01 - obtem a lista de Team Projects
        DataSet dsListaTeamProject = CriaDDL.dsListaTeamProject("PACK_GERA_DDL.SP_LISTA_TEAM_PROJECT", ddl_cod_sist.SelectedValue == "0" ? null : ddl_cod_sist.SelectedItem.ToString());

        //02 - obtem a lista de tipos de objetos arquivos
        DataSet dsListaArquivo = CriaDDL.dsListaArquivo("PACK_GERA_DDL.SP_LISTA_ARQUIVO");

        Boolean GravaArquivo = false;

        foreach (DataRow drListaTeamProject in dsListaTeamProject.Tables[0].Rows) 
        {
            foreach (DataRow drListaArquivo in dsListaArquivo.Tables[0].Rows)
            {
                //03 - para cada Team Project, cria a pasta correspondente
                NomeDiretorio = GDCriaDiretorio.NomeDiretorioCriado(drListaArquivo[1].ToString(), drListaTeamProject[0].ToString(), drListaTeamProject[1].ToString(), false);

                //04 - obtem a lista de objetos, para o tipo de objeto em questão
                DataSet dsListaObjeto = CriaDDL.dsListaObjeto("PACK_GERA_DDL.SP_LISTA_OBJETO", drListaArquivo[1].ToString(), drListaTeamProject[0].ToString());

                foreach (DataRow drListaObjeto in dsListaObjeto.Tables[0].Rows)
                {
                    //05 - para cara objeto do tipo, cria um arquivo .sql
                    NomeArquivo = GDCriaArquivo.NomeArquivoCriado(NomeDiretorio, drListaObjeto[0].ToString(), true);

                    //06 - para cada objeto, grava o comando de CREATE no arquivo correspondente
                    GravaArquivo = GDCriaArquivo.GravaArquivo(NomeArquivo, drListaObjeto[1].ToString());
                }
            }
        }

        lbl_resultado.Text = "Arquivos do TS gerados com sucesso";
        lbl_resultado.Visible = true;
    }
}
